import { getToken, removeToken, setToken, setTimeStamp, removeTimeStamp } from '@/utils/auth';
import { getInfo, getUserDetailById, login } from '@/api/user'
import { resetRouter } from '@/router';

// 状态
const state = {
  // 设置 token 的共享状态
  // 一初始化 vuex 就从缓存中拿到 token 值
  token: getToken(),
  // 用户数据
  userInfo: {} // 定义一个空的对象 不是null 因为后边我要开发userInfo的属性给别人用  userInfo.name
}
// 修改状态
const mutations = {
  // 设置 vuex 中的 token 值
  setToken(state, token) {
    // 把获取到的 token 值赋值给 state 中的 token
    state.token = token
    // 把 token 值同步给缓存
    setToken(token)
  },
  // 删除 token 值
  removeToken(state) {
    // 把 token 值置空
    state.token = null
    // 把 token 从缓存中删除
    removeToken()
  },
  // 设置用户信息
  setUserInfo(state, user) {
    // 用浅拷贝的方式去赋值对象
    // 因为这样数据更新之后，才会触发组件的更新
    // state.userInfo = { ...user }
    state.userInfo = user
  },
  // 删除用户信息
  reomveUserInfo(state) {
    state.userInfo = {}
  },
}
// 执行异步
const actions = {
  // context 相当于 this.$store
  // data 传递的值
  async login(context, data) {
    // 接受返回的值
    // 因为 axios 中包了一层 data，把里面的 data 属性解构出来
    // data : res 给 data 换个 res 别名
    // 实际上就是 promise.resole 返回的值,result 返回结果
    const result = await login(data)
    // 把 token 值，赋值给 state 中的 token
    // 想要修改值的话，需要通过 mutations 中的方法进行修改、
    context.commit('setToken', result)
    // 把获取 token 的时间，存入时间戳
    setTimeStamp()
  },

  // 获取用户信息
  async getUserInfo(context) {
    const result = await getInfo()
    const baseInfo = await getUserDetailById(result.userId)
    // 把 2个对象的值，拓展出来合并到一个对象上
    const baseResult = { ...result, ...baseInfo }
    context.commit("setUserInfo", baseResult)
    return baseResult
  },

  // 退出账号
  logout(context) {
    // 删除 token
    context.commit('removeToken')
    // 删除用户信息
    context.commit('reomveUserInfo')
    // 删除时间戳
    removeTimeStamp()
    // 重置路由
    resetRouter()
    // 把 Vuex 中的路由也还原
    // 调用根级的 actions
    context.commit("permission/setRoutes", [], { root: true })
  }
}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
